package com.xizi.Jvm;

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.util.concurrent.TimeUnit;

// 虚引用 设置虚引用关联的唯一目的，就是在这个对象被收集器回收的时候，收到一个系统通知或者后续添加进一步的处理
public class PhantomReferenceDemo {

    public static void main(String[] args) {
        Object o1 = new Object();
        // 创建引用队列
        ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();

        // 创建一个弱引用
//        WeakReference<Object> weakReference = new WeakReference<>(o1, referenceQueue);

        // 创建一个虚引用
        // PhantomReference的get方法总是返回null，
        PhantomReference<Object> weakReference = new PhantomReference<>(o1, referenceQueue);

        System.out.println(o1); // java.lang.Object@5b2133b1
        System.out.println(weakReference.get()); // null
        // 取队列中的内容
        System.out.println(referenceQueue.poll()); // null
        System.out.println("======================");
        o1 = null;
        System.gc();
        System.out.println("执行GC操作");
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(o1); // null
        System.out.println(weakReference.get()); // null
        // 取队列中的内容
        System.out.println(referenceQueue.poll()); // java.lang.ref.PhantomReference@72ea2f77
    }
}